package com.zf.generic;

import java.util.ArrayList;

//https://www.cnblogs.com/softidea/p/4106659.html
/**
 * PECS原则：生产者（Producer）使用extends，消费者（Consumer）使用super。
 * 站在泛型容器的角度，容器是吸收对象（Consumer）还是提供对象（Producer）；
 * 如果一个列表即要生产，又要消费，你不能使用泛型通配符声明列表，如List<Integer>；
 */

/*
参考: https://mp.weixin.qq.com/s/t6FS6lhFrQXlNQic8ZZ52A

PECS原则总结：
1、如果要从集合中读取类型T的数据，并且不能写入，可以使用 ? extends 通配符；(Producer Extends) 协变 Out
2、如果要从集合中写入类型T的数据，并且不需要指定类型读取，可以使用 ? super 通配符；(Consumer Super) 逆变 In
3、如果既要存又要取，那么就不要使用任何通配符。
 */
public class InOutGenericTest {

    static class Parent{

    }

    static class Son extends Parent{

    }

    static class GrandSon extends Son{

    }

    public static void main(String[] args) {
        ArrayList<? super Son> list = new ArrayList<>();
        //不能放 父类，只能放Son及其子类
        // list.add(new Parent());//编译报错
        list.add(new GrandSon());//编译通过
        list.add(new Son());

        /*
        参考: https://mp.weixin.qq.com/s/t6FS6lhFrQXlNQic8ZZ52A
         */
        ArrayList<Number> numbers = new ArrayList<>();
        numbers.add(1);
        numbers.add(null);
        numbers.add(Integer.parseInt("1"));
    }
}


